home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Nibble Volume 09, No. 11 (1988-11)(MicroSPARC)(Side B).zip / Nibble Volume 09, No. 11 (1988-11)(MicroSPARC)(Side B).do / T.RECALL.s < prev    next >
Text File  |  1996-12-24  |  5KB  |  107 lines

  1.  
  2. ********************************
  3. *  RECALL SOURCE CODE          *
  4. *  BY DOUG MEEK                *
  5. *  COPYRIGHT(C) 1988           *
  6. *  MICROSPARC, INC.            *
  7. *  CONCORD, MA 01742           *
  8. *  MERLIN ASSEMBLER            *
  9. ********************************
  10.  
  11. CONT@R    EQU $92        ;ASCII CODE FOR CONTROL 'R'
  12. CONT@E    EQU $85        ;ASCII CODE FOR CONTROL 'E'
  13. DOSJSR    EQU $9EAF      ;DOS JSR TO INPUT HOOK
  14. BASL      EQU $28        ;TEXT LINE BASE ADDRESS
  15. COUT      EQU $9FC5      ;A JUMP TO OUTPUT HANDLER
  16. RDCHAR    EQU $9EBA      ;A JUMP TO INPUT HANDLER
  17. BELL2     EQU $FBE4      ;BELL WITH DURATION 'Y'
  18. IN        EQU $200       ;NORMAL INPUT BUFFER
  19. RD80VID   EQU $C01F      ;READ VIDEO MODE SWITCH
  20. OURCH     EQU $57B       ;80 COLUMN CH
  21. BUFF      EQU $280       ;OUR BACKUP BUFFER
  22. CH        EQU $24        ;40 COLUMN CH
  23. YSAVE     EQU $AA5B      ;DOS Y REGISTER SAVE
  24. ASAVE     EQU $AA5C      ;DOS A REGISTER SAVE
  25. XSAVE     EQU $AA5A      ;DOS X REGISTER SAVE
  26. IDBYTE    EQU $FBB3
  27.  
  28.           ORG $300
  29.  
  30. INIT      LDA #<INTCPT   ;ALTER DOS TO ROUTE ITS INPUT
  31.           STA DOSJSR     ;THROUGH THIS ROUTINE
  32.           LDA #>INTCPT   ;BY REDIRECTING ITS CALL TO
  33.           STA DOSJSR+1   ;THE MONITOR INPUT HANDLER
  34. INITRET   RTS
  35.  
  36. REMOVE    LDA #<RDCHAR   ;RESTORE ORIGIONAL DOS JSR
  37.           STA DOSJSR     ;TO THE INPUT HANDLER AND
  38.           LDA #>RDCHAR   ;BYPASS THIS ROUTINE
  39.           STA DOSJSR+1
  40.           RTS
  41.  
  42. INTCPT    JSR RDCHAR     ;GET INPUT THROUGH NORMAL
  43.           STA ASAVE      ;INPUT ROUTINE AND SAVE IT
  44.           CMP #$8D       ;<RETURN> END OF THE INPUT LINE
  45.           BEQ DONE       ;SAVE THE NEW LINE IN THE BUFFER
  46.           CMP #CONT@R    ;<^R> REPEAT LAST COMMAND ENTERED
  47.           BEQ DOLAST     ;IN ITS ENTIRETY
  48.           CMP #CONT@E    ;<^E> REPEAT LAST COMMAND ENTERED
  49.           BEQ DOLAST     ;ONE CHARACTER AT A TIME
  50.           LDX XSAVE      ;THIS IS THE COUNT OF CHARACTERS
  51.           CPX #120       ;ENTERED - IF 120 OR GREATER WARN
  52.           BLT BACK       ;THE USER THEY ARE NEARING THE
  53.           LDY #$15       ;LIMIT BY CLICKING THE SPEAKER
  54.           PHA            ;SAVE ENTERED CHARACTER ON STACK
  55.           JSR BELL2
  56.           PLA            ;RESTORE ENTERED CHARACTERED
  57.           JMP BACK       ;TO CALLER WITH CHAR ENTERED
  58. DONE      LDY XSAVE      ;GET INPUT LENGTH
  59.           BEQ BACK       ;ONLY RETURN SO DON'T ALTER LAST
  60.           STY LEN        ;AND SAVE IT FOR FUTURE REFERENCE
  61.           BMI BACK       ;IF LENGTH IS GREATER THAN 127
  62.           PHA            ;WE CAN'T SAVE INPUT FOR REPEAT
  63.           STA BUFF,Y     ;OTHERWISE INPUT -> TEMPLATE
  64.           DEY            ;STARTING WITH RETURN CHARACTER
  65. MOVE      LDA IN,Y       ;AND MOVING BACK TO BEGINNING
  66.           STA BUFF,Y
  67.           DEY
  68.           BPL MOVE
  69.           PLA            ;RESTORE RETURN CHARACTER
  70. BACK      LDX XSAVE      ;SET X FOR RETURN TO CALLER
  71.           LDY CH         ;AND SET CH
  72.           RTS
  73. DOLAST    LDY LEN        ;IF LENGTH WAS 128 OR MORE CAN'T
  74.           BMI BACK       ;REPEAT LAST CAUSE ITS LOST
  75.           BEQ BACK       ;THIS MEANS NO COMMAND IN BUFFER
  76. DOLAST1   LDY XSAVE      ;MOVE LAST COMMAND FROM BUFFER TO
  77.           LDA BUFF,Y     ;THE INPUT BUFFER
  78.           CMP #$8D       ;CHECK FOR END OF INPUT LINE
  79.           BEQ INTEXP     ;AND QUIT THERE
  80.           STA $200,Y     ;OTHERWISE MOVE & PRINT TO SCREEN
  81.           LDY CH         ;ALL CHARACTERS
  82.           JSR COUT
  83.           INC XSAVE      ;INCREMENT THE CHARACTER COUNT SO
  84.           LDA ASAVE      ;CALLER KNOWS LENGTH
  85.           CMP #CONT@E    ;<^E> IF SINGLE CHARACTER REPEAT
  86.           BNE DOLAST1    ;STOP WITH ONE REPEATED CHARACTER
  87. INTEXP    LDX XSAVE      ;RETURN WITH X SET TO LENGTH
  88.           LDY CH         ;Y SET TO HORIZONTAL POSITION
  89.           BIT IDBYTE     ;CHECK FOR II+ OR IIe
  90.           BMI IIPLUS     ;IF SET ITS A II+
  91.           BIT RD80VID    ;IF 80 WAS ACTIVE IT SET 'CH' TO '0'
  92.           BPL M40        ;HIGH BIT '0' MEANS 40 COLUMN
  93.           LDY OURCH      ;80 ACTIVE SO SET TO 80 COL CH
  94.           STY CH         ;SO CALLER KNOWS WHERE WE WERE
  95. M40       STY YSAVE      ;SAVE 'Y' BEFORE RETURN
  96.           LDA (BASL),Y   ;RETURN WITH THE SCREEN CHARACTER
  97.           JMP INTCPT     ;BACK TO INPUT FOR NEXT CHAR
  98. IIPLUS    STY YSAVE      ;HERE FOR A II+ BEFOR RETURN
  99.           LDA (BASL),Y   ;SCREEN CHARACTER FOR RETURN
  100.           PHA            ;SAVE AS IS FOR LATER
  101.           AND #$3F       ;MAKE POSITIVE ASCII
  102.           ORA #$40       ;AND FLASHING
  103.           STA (BASL),Y   ;FOR CURSOR POSITION
  104.           PLA            ;AND RETURN WITH THE ORIGIONAL
  105.           JMP INTCPT
  106. LEN       DFB 0          ;STORAGE FOR LAST COMMAND LENGTH
  107.